/*********************************************************************
 * Copyright (C) 2002 Andrew Khan
 * <p>
 * This library is free software; you can redistribute it and/or
 * modify it under the terms of the GNU Lesser General Public
 * License as published by the Free Software Foundation; either
 * version 2.1 of the License, or (at your option) any later version.
 * <p>
 * This library is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 * Lesser General Public License for more details.
 * <p>
 * You should have received a copy of the GNU Lesser General Public
 * License along with this library; if not, write to the Free Software
 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
 ***************************************************************************/

package jxl.biff;

import jxl.Cell;
import jxl.Range;
import jxl.Sheet;
import jxl.common.Logger;

/**
 * Implementation class for the Range interface.  This merely
 * holds the raw range information, and when the time comes, it
 * interrogates the workbook for the object.
 * This does not keep handles to the objects for performance reasons,
 * as this could impact garbage collection on larger spreadsheets
 */
public class RangeImpl implements Range {
    /**
     * The logger
     */
    private static Logger logger = Logger.getLogger(RangeImpl.class);

    /**
     * A handle to the workbook
     */
    private WorkbookMethods workbook;

    /**
     * The sheet index containing the column at the top left
     */
    private int sheet1;

    /**
     * The column number of the cell at the top left of the range
     */
    private int column1;

    /**
     * The row number of the cell at the top left of the range
     */
    private int row1;

    /**
     * The sheet index of the cell at the bottom right
     */
    private int sheet2;

    /**
     * The column index of the cell at the bottom right
     */
    private int column2;

    /**
     * The row index of the cell at the bottom right
     */
    private int row2;

    /**
     * Constructor
     * @param w the workbook
     * @param es the external sheet
     * @param s1 the sheet of the top left cell of the range
     * @param c1 the column number of the top left cell of the range
     * @param r1 the row number of the top left cell of the range
     * @param s2 the sheet of the bottom right cell
     * @param c2 the column number of the bottom right cell of the range
     * @param r2 the row number of the bottomr right cell of the range
     */
    public RangeImpl(WorkbookMethods w,
                     int s1, int c1, int r1,
                     int s2, int c2, int r2) {
        workbook = w;
        sheet1 = s1;
        sheet2 = s2;
        row1 = r1;
        row2 = r2;
        column1 = c1;
        column2 = c2;
    }

    /**
     * Gets the cell at the top left of this range
     *
     * @return the cell at the top left
     */
    public Cell getTopLeft() {
        Sheet s = workbook.getReadSheet(sheet1);

        if (column1 < s.getColumns() &&
                row1 < s.getRows()) {
            return s.getCell(column1, row1);
        } else {
            return new EmptyCell(column1, row1);
        }
    }

    /**
     * Gets the cell at the bottom right of this range
     *
     * @return the cell at the bottom right
     */
    public Cell getBottomRight() {
        Sheet s = workbook.getReadSheet(sheet2);

        if (column2 < s.getColumns() &&
                row2 < s.getRows()) {
            return s.getCell(column2, row2);
        } else {
            return new EmptyCell(column2, row2);
        }
    }

    /**
     * Gets the index of the first sheet in the range
     *
     * @return the index of the first sheet in the range
     */
    public int getFirstSheetIndex() {
        return sheet1;
    }

    /**
     * Gets the index of the last sheet in the range
     *
     * @return the index of the last sheet in the range
     */
    public int getLastSheetIndex() {
        return sheet2;
    }
}









